//  https://stackoverflow.com/questions/55603111/unable-to-compile-rust-hello-world-on-windows-linker-link-exe-not-found

/*
我遇到了类似的问题 " error: linking with link.exe failed: exit code: 1 "

To solve it, I did
要解决这个问题，我这样做：
    rustup toolchain install stable-x86_64-pc-windows-gnu

then
    rustup default stable-x86_64-pc-windows-gnu

and
    cargo build
      Compiling hello v0.1.0 (C:\Users\leke\dev\rust\hello)
        Finished dev [unoptimized + debuginfo] target(s) in 1.66s
*/

//! <h1>文档注释</h1><br>
//! <p>其内容将被解析成 HTML 帮助</p>

mod demo1;

fn main() {
    // println! 是一个宏（macros），可以将文本输出到控制台（console）。
    println!("Hello, world!");
    println!("Hello, {:?}!", "world");
    println!("Hello, {}!", "world");

    let x = 5 + /* 90 + */ 5;
    println!("x 的值是 {}!", x);

    /** 格式化输出
    打印操作由 std::fmt 里面所定义的一系列宏来处理，包括：
    format! ：将格式化文本写到字符串。
    print! ：与 format! 类似，但将文本输出到控制台（io::stdout）。
    println! : 与 print! 类似，但输出结果追加一个换行符。
    eprint! ：与 print! 类似，但将文本输出到标准错误（io::stderr）。
    eprintln! ：与 eprint! 类似，但输出结果追加一个换行符。
    */
    // 通常情况下，`{}`会被任意变量内容所替换。
    // 变量内容会转化成字符串 。
    println!("{} days", 31);
    // 不加后缀 31 自动成为 i32 类型
    // 可以添加后缀指定类型，如：31u8 声明 为 u8 类型

    // 可以使用命名参数。
    println!(
        "{subject} {verb} {object}",
        object = "the lazy dog",
        subject = "the quick brown fox",
        verb = "jumps over"
    );

    // 可以使用 `:` 来指定参数格式。
    println!("{} of {:b} people know binary, the other half don't", 1, 2);

    // 可以按指定宽度来右对齐文本
    // 下面语句输出 "     1", 5个空格后面连着1。 因为 1 的宽度为 1，而宽度为 6
    println!("{number:>width$}", number = 1, width = 6);

    // 可以在数字左边补 0。 下面语句输出 "000001"
    println!("{number:>0width$}", number = 1, width = 6);

    // println! 会检查使用到的参数数量是否正确
    // println!("My name is {0}, {1} {0}", "Joe");
    // 改正 ^ 补上漏掉的参数："Joe", "Kane"

    // 创建一个包含单个 "i32" 的结构体（structure）。命名为 "Structure"
    #[allow(dead_code)]
    #[derive(Debug)]
    struct Structure(i32);

    // 但是，这个结构体（structure）的格式化（formatting）还没有实现
    // 所以，当尝试运行下面的代码时，会出错。
    // println!("This struct `{}` won't print...", Structure(3));
    // 改正 ^ 删除上面注释的代码，并添加正确的代码
    println!("This struct `{:?}` won't print...", Structure(3));

    let pi = 3.141592;
    println!("Pi is roughly {:.3}", pi);

    println!("number {:04}", 42);
    demo1::hello();
    // 添加等待输入
    use std::io;
    let mut input = String::new();
    io::stdin()
        .read_line(&mut input)
        .expect("Failed to read line");
}
